import requests
import hashlib
import random

from config import Config

class BaseTranslator:
    """
    基类。继承以创建一个翻译字词的对象。
    """
    def __init__(self) -> None:
        pass

    def translate(self, word:str, type:str = None) -> str:
        """
        翻译 word 并返回结果。
        """

    def init(self, config:Config) -> None:
        """
        设置配置键值等。
        """
        pass

    def config(self, config:dict) -> None:
        """
        读取配置数据。
        """
        pass

class BaiduTranslator(BaseTranslator):
    """
    基于百度翻译api的翻译对象。
    """
    api = "http://api.fanyi.baidu.com/api/trans/vip/translate"
    connection_error_result = {
        "error_code": "114514",
        "error_msg": "Connection Error"
    }
    def __init__(self) -> None:
        self.appid = ""
        self.secret = ""
        
    def init(self, config:Config) -> None:
        """
        需要读取APPID和密钥。
        """
        config.define_key("appid","") \
              .define_key("secret","")
        
    def config(self, config:dict) -> None:
        self.appid = config["appid"]
        self.secret = config["secret"]

    def get_sign(self, content, salt) -> str:
        """
        Step1. 将请求参数中的 APPID(appid)， 翻译 query(q，注意为UTF-8编码)，随机数(salt)，以及平台分配的密钥(可在管理控制台查看) 按照 appid+q+salt+密钥的顺序拼接得到字符串 1。
        Step2. 对字符串 1 做 MD5 ，得到 32 位小写的 sign。
        """
        c = self.appid + content + salt + self.secret
        hash_data = hashlib.md5()
        hash_data.update(c.encode("utf-8"))
        return hash_data.hexdigest().lower()

    def translate(self, word: str, type: str = None) -> dict:
        """
        调用百度翻译api进行翻译。
        """
        q = word
        from_ = "wyw" # 文言文
        to = "zh" # 简中
        salt = "".join(random.sample('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890',16))
        sign = self.get_sign(q, salt)

        params = {
            "q": q,
            "from": from_,
            "to": to,
            "appid": self.appid,
            "salt": salt,
            "sign": sign
        }

        # 发送请求 
        try:
            result = requests.get(
                self.api, params,
            ).json()
        except requests.ConnectionError:
            result = self.connection_error_result

        return result